#ifndef __MATRIX_H__
#define __MATRIX_H__

#include <iostream>

// This enum helps to create a identity matrix on Constructor.
enum matrix_type {
    NORMAL_MATRIX = 0,
    IDENTITY_MATRIX,
};

class Vector; //Forward Declaration

class Matrix {
	public:
		Matrix(const unsigned int& = 1,const unsigned int& = 1, const unsigned int& = NORMAL_MATRIX);
		Matrix(const Matrix&);
		~Matrix(void);

		unsigned int getRow(void) const;
		unsigned int getColumn(void) const;

		void print(void) const;

		double* operator[] (unsigned int) const;
		Matrix  operator-  (void) const;

		Matrix meanColumn(Matrix * = NULL) const;//é uma matriz onde as linhas são todas iguais (so para poder subtrarir masi facil
        //porem a matrix do atributo guada so uma linha

		Matrix getOneRow(unsigned int = 0) const;//retorna so a linha escolhida

		Matrix covarianceMatrix(void) const;
		Matrix covarianceMatrix2(void) const;

		Matrix transpose(void) const;
		Vector toVector(unsigned int = 0) const;
		Matrix& operator= (const Matrix&);

	private:
		unsigned int row, column;
		double **data;
};

Matrix operator+(const Matrix&,const Matrix&);
Matrix operator-(const Matrix&,const Matrix&);
Matrix operator*(const Matrix&,const Matrix&);
Matrix operator*(const Matrix&,double);

#endif

